ABI & EABI

ABI(Application Binary Interface)
응용 프로그램과 운영체제 또는 라이브러리와의 표준화된 인터페이스를 제공하는 것을 말한다.
ABI는 서로 다른 컴파일러가 만든 오브젝트 파일을 연결하여 사용할 수 있게 한다.

Application 간 binary 데이터를 교환하는 규칙
- 데이터 타입과 정렬방법
- 함수 호출 시 인수 및 결과에 대한 레지스터 교환 방법
- 시스템 콜 호출 방법
- 프로그램 코드의 시작과 데이터에 대한 초기화 방법
- 파일 교환 방법(ELF 등)
API & ABI
ABI는 API보다 저수준(binary)이며, API는 소스코드에서 사용되고 ABI는 바이너리에서 호환이 된다는 차이가 있다.
아키텍처와 운영체제마다 조금씩 다르다.
EABI(Embedded ABI)
ARM이나 PPC(PowerPC)같은 임베디드 시스템에 적합하도록 개정된 ABI 표준을 말한다.
임베디드 프로그램을 수행하는 파일형식, 자료형, 레지스터 사용, 스택 프레임 조직, 명령 변수를 위한 표준 변환을 정의

EABI를 지원하는 컴파일러는 이와 같은 또 다른 컴파일러가 만든 코드와 호환되는 목적 코드를 만드므로
개발자들이 다른 컴파일러가 만들어낸 목적 코드와 한 컴파일러로 만든 라이브러리르 연결할 수 있게 한다.

자체적인 어셈블리어 코드를 작성하는 개발자들은 EABI를 사용해서 호환 컴파일러가 만들어낸 어셈블리 코드와 상호작용하게
할 수 있다.
ABI & EABI
EABI는 일반 운영체제의 ABI에 비해 권한 명령이 응용 프로그램 코드 내에서 실행되는 점, 동적 링크가 요구되지 않는다는 점,
메모리 저장을 위해 더 작아진 스택 프레임을 조직을 갖춘다는 점이 다르다.
ARM Architechure
1. arm/OABI
커널 v2.6.15 이전에 사용되던 ABI 방식
glibc v2.3.6까지 사용
gcc: linux-arm-none-gnu
2. arm/EABI
커널 v2.6.16부터 사용되는 ARM EABI 방식
glibc v2.3.7 및 v2.4부터 사용
gcc: linux-arm-none-gnueabi
EABI를 지원하기 위해서는 cross-compile을 할 때에 EABI 표준을 지원하는 교차 컴파일러를 사용해야 한다.